home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Original Shareware 1.1
/
The Original Shareware (WeMake CDs)(Volume 1.1)(CDs, Inc)(1993).iso
/
32
/
tictacai.zip
/
TTSUBS.ASM
< prev
Wrap
Assembly Source File
|
1990-06-17
|
9KB
|
346 lines
;*****************************************************************************
;
; TTSUBS.ASM
;
; Copyright (C) 1990 by Aaron L. Brenner
;
; Purpose:
; Subroutines for TICTAC.C
;
; Contents:
; mouse_init() Initialize the mouse.
; mouse_on() Turns mouse processing on.
; mouse_off() Turns mouse processing off.
; mouse_bounds() Set the mouse cursor boundaries.
; mouse_cursor() Turn the mouse cursor on or off.
; mouse_buttons() Get the state of the mouse buttons.
; mouse_in_region() Determine whether or not the mouse is in a
; region.
;
; Revision history:
; 1.00 06/13/90 ALB Created.
;
;*****************************************************************************
include mixed.inc
clang equ 0
ifndef model
model equ <small>
endif
setmodel
;*****************************************************************************
;
; The mouse_info array gets set by our int handler, and is structured:
;
;*****************************************************************************
mseinfo struc
mi_flags db ? ; Bit flags:
; bit 0 = 1 Mouse present
; bit 1 = 1 Mouse handling ON
mi_buttons db ? ; Button status
mi_row db ? ; Current cursor row
mi_col db ? ; Current cursor column
mseinfo ends
;*****************************************************************************
;
; Structure used to define screen regions
;
;*****************************************************************************
REGION struc
r_ulrow db ? ; Upper left row
r_ulcol db ? ; Upper left column
r_lrrow db ? ; Lower right row
r_lrcol db ? ; Lower right column
REGION ends
.data
mouse_info mseinfo<0, 0, 0, 0>
.code
;*****************************************************************************
;
; This is the user interrupt routine set by Fn 12. All it does is record the
; information passed by the mouse driver.
;
;*****************************************************************************
mse_int proc far
push ds ; Save it; it's the mouse driver's seg
mov ax,DGROUP ; Get our data segment
mov ds,ax ;
test mouse_info.mi_flags,2 ; Should we pay attention?
jz msei_exit ; No - ignore this stuff
mov mouse_info.mi_buttons,bl; Save the button state
mov ax,cx ; Get the column
mov cl,3 ; Divide row and column by 8
shr ax,cl ; since mse driver reports pixel
mov mouse_info.mi_col,al ; positions instead of text char
shr dx,cl ; positions
mov mouse_info.mi_row,dl ; Save the row
msei_exit:
pop ds ; Restore their segment
ret ; Return to mouse driver
mse_int endp
;*****************************************************************************
;
; int mouse_init(void)
;
; Purpose:
; Initializes the mouse, setting a user int handler.
;
; Input:
; None.
;
; Output:
; Function returns non-zero if there is a mouse.
;
;*****************************************************************************
hproc mouse_init <uses ax bx cx dx es>
sub ax,ax ; Fn 0 - Reset mouse driver
mov mouse_info.mi_flags,al ; Clear the flag
int 33h ;
or ax,ax ; Is there a mouse?
jz hkms_exit ; Nope - just exit
and al,1 ; Just use the low bit
mov mouse_info.mi_flags,al ; Set the flag saying we have one
push cs ; Need segment of the routine
pop es ;
mov dx,offset mse_int ; Address of routine to call
mov cx,0000000000011110b ; Call mask (any button activity)
mov ax,12 ; Fn 1 - Set user int sub
int 33h ;
hkms_exit:
mov al,mouse_info.mi_flags ; Get the presence flag
sub ah,ah ; to return
hret ; Return to caller
hendp
;*****************************************************************************
;
; void mouse_on(void)
;
; Purpose:
; Turn mouse processing on. This turns the mouse cursor on, and tells
; our int handler to start noticing what the mouse is doing.
;
; Input:
; None.
;
; Output:
; Mouse processing is enabled.
;
;*****************************************************************************
hproc mouse_on <uses ax>
test mouse_info.mi_flags,1 ; Do we have a mouse?
jz mson_exit ; No - never mind
mov ax,1 ; Turn the cursor on
int 33h ;
cli ; Disallow ints for a sec
or mouse_info.mi_flags,2 ; Enable our processing of mouse
sti ;
mson_exit:
hret ; Return to caller
hendp
;*****************************************************************************
;
; void mouse_off(void)
;
; Purpose:
; Disables further mouse processing.
;
; Input:
; None.
;
; Output:
; Mouse processing is disabled, and the mouse cursor is turned off.
;
;*****************************************************************************
hproc mouse_off <uses ax>
test mouse_info.mi_flags,1 ; Is there a mouse?
jz msof_exit ; No - never mind
cli ; Disallow these for a sec
and mouse_info.mi_flags,not 2; Disable mouse processing
sti ;
mov ax,2 ; Turn the cursor off
int 33h ;
msof_exit:
hret ; Return to caller
hendp
;*****************************************************************************
;
; void mouse_bounds(int ulrow, int ulcol, int lrrow, int lrcol)
;
; Purpose:
; Set the bounds for the mouse cursor.
;
; Input:
; ulrow,
; ulcol Row and column for the upper left corner
; lrrow,
; lrcol Row and column for the lower right corner
;
; Output:
; None. The mouse driver is notified.
;
;*****************************************************************************
hproc mouse_bounds <uses ax bx cx dx> ulr:word, ulc:word, lrr:word, lrc:word
test mouse_info.mi_flags,1 ; Is there a mouse?
jz msbd_exit ; Nope - exit now
mov ax,ulr ; Get upper row
mov dx,lrr ; and lower row
mov cl,3 ; Gotta multiply by 8 to come out the
shl ax,cl ; way the mouse driver wants
shl dx,cl ;
mov cx,ax ;
mov ax,8 ; Set vertical bounds
int 33h ;
mov ax,ulc ; Get left column
mov dx,lrc ; and right column
mov cl,3 ; Multiply them
shl ax,cl ;
shl dx,cl ;
mov cx,ax ;
mov ax,7 ; Set horizontal bounds
int 33h ;
msbd_exit:
hret ; Return to caller
hendp
;*****************************************************************************
;
; void mouse_cursor(int on_off)
;
; Purpose:
; Turn the mouse cursor on or off.
;
; Input:
; on_off Flag indicating whether the mouse cursor
; should be turned on or off:
; on_off = 0 Turn it off
; on_off != 0 Turn it on
;
; Output:
; The mouse cursor is on or off, as desired.
;
;*****************************************************************************
hproc mouse_cursor <uses ax bx> on_off:word
test mouse_info.mi_flags,1 ; Is there a mouse?
jz mscr_exit ; Nope - don't bother
mov bx,on_off ; Get the flag value
mov ax,1 ; Start with ON
cmp bx,1 ; See if BX = 0 or not
adc ax,0 ; If BX = 0, then AX = 2 (OFF)
int 33h ; Call the mouse driver
mscr_exit:
hret ; Return to caller
hendp
;*****************************************************************************
;
; int mouse_buttons(void)
;
; Purpose:
; Get the state of the mouse buttons.
;
; Input:
; None.
;
; Output:
; Function returns the button state where:
; bit 0 = 1 if the left button is down
; bit 1 = 1 if the right button is down
;
;*****************************************************************************
hproc mouse_buttons
sub ax,ax ; Just in case it's early exit
test mouse_info.mi_flags,1 ; Is there a mouse?
jz msbt_exit ; Nope - exit with 0
mov al,mouse_info.mi_buttons; Get the button info
and al,3 ; Just in case
msbt_exit:
hret ; Return to caller
hendp
;*****************************************************************************
;
; int mouse_in_region(REGION *region_list, int num_regions)
;
; Purpose:
; Determine whether or not the mouse cursor is in a specific region of
; the screen.
;
; Input:
; region_list Pointer to a list of region structures
; num_regions Number of elements in that list
;
; Output:
; Function returns -1 if the mouse cursor is not in any region, or the
; index of the region structure.
;
;*****************************************************************************
hproc mouse_in_region <uses bx cx dx ds> rlist:ptr, rnum:word
test mouse_info.mi_flags,1 ; Is there a mouse?
jz mirg_none ; Nope - return as if not in a region
mov cx,rnum ; Get the number of structures
sub dx,dx ; Start counter at 0
mov ax,word ptr mouse_info.mi_row ; Get the row & column (AL,AH)
plds bx,rlist ; Point to the region list
mirg_l1:
cmp al,[bx].r_ulrow ; See if we're above it
jb mirg_l2 ; Yep - not this one
cmp al,[bx].r_lrrow ; See if we're below it
ja mirg_l2 ; Yep - not this one
cmp ah,[bx].r_ulcol ; See if we're to the left of it
jb mirg_l2 ; Yep - not this one
cmp ah,[bx].r_lrcol ; See if we're to the right of it
ja mirg_l2 ; Yep - not this one, period
mov ax,dx ; Get index of this one
jmp short mirg_exit ; Exit now
mirg_l2:
add bx,size REGION ; Point to next one
inc dx ; Count it
loop mirg_l1 ; Loop for all of them
mirg_none:
;
; Not in any region - return -1
;
mov ax,-1 ; Set return value
mirg_exit:
hret ; Return to caller
hendp
end